home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Apple II Magazines (PO)
/
Nibble Volume 12, No. 10 (1991-10)(MindCraft Publishing)(Side A)[a].zip
/
Nibble Volume 12, No. 10 (1991-10)(MindCraft Publishing)(Side A)[a].po
/
AUTOSAVE.S
< prev
next >
Wrap
Text File
|
1996-12-24
|
12KB
|
359 lines
********************************
* AUTOSAVE Source Code *
* BY ROBERT T. YUILLE *
* COPYRIGHT (C) 1991 *
* BY MINDCRAFT PUB. CORP. *
* CONCORD, MA 01742 *
* *
* MERLIN 8/16 *
********************************
*
CH = $24 ; horizontal cursor
CV = $25 ; vertical cursor
OPLEN = $2F ; opcode length
A1L = $3C ; mem move start
A2L = $3E ; mem move end
A4L = $42 ; mem move destination
PGMST = $67 ; BASIC program start
HIMEM = $73 ; HIMEM location
PGMEND = $AF ; BASIC program end
TMP = $FA ; temp location
PTR = $FB ; pointer
INBUF = $200 ; input buffer
PFXBUF = $300 ; Prefix buffer
FNAM = $350 ; filename buffer
OURCH = $57B ; 80-col horiz cursor
KBD = $C000 ; keyboard
STROBE = $C010 ; keyboard strobe
RD80COL = $C01F ; read 80/40 display switch
CHKOPLEN = $F88E ; check opcode length
TABV = $FB5B ; set vertical cursor
UP = $FC1A ; move cursor up a line
CLREOL = $FC9C ; clear to end of line
GETLN1 = $FD6F ; get input line
CROUT = $FD8E ; CR out
COUT = $FDED ; character out
MOVE = $FE2C ; move memory
*
TBUF = $BCBC ; temp pathname buffer
EXTRNCMD = $BE06 ; external command hook
ERROUT = $BE09 ; error handler
XRETURN = $BE9E ; known RTS
XTRNADDR = $BE50 ; external command address
XLEN = $BE52 ; external cmd length-1
XCNUM = $BE53 ; basic command no. (0-ext)
PBITS = $BE54 ; parameter bits allowed
GOSYSTEM = $BE70 ; execute MLI call
CRACESS = $BEA3 ; access code
CRFILID = $BEA4 ; file_type
CRAUXID = $BEA5 ; aux_type
CRFKIND = $BEA7 ; storage_type
SSGINFO = $BEB4 ; Get/Set info parm count
FIMDATE = $BEBE ; modification date
SREFNUM = $BEC7 ; SEOF ref. number
SUNITNUM = $BEC7 ; device slot & drive no.
SBUFADR = $BEC8 ; ON_LINE data buffer
SEOF = $BEC8 ; EOF data
OSYSBUF = $BECE ; I/O buffer
OREFNUM = $BED0 ; Open ref. number
RWREFNUM = $BED6 ; Read/Write ref. number
RWDATA = $BED7 ; Read/Write data pointer
RWCOUNT = $BED9 ; Read/Write byte count
CFREFNUM = $BEDE ; Close ref. number
GETBUFR = $BEF5 ; allocate buffer
DATM = $BF90 ; PRODOS Date/Time location
*
ORG $2000
*
CLD
LDA #>END-START+$100
JSR GETBUFR ; set HIMEM
BCC :1
JMP ERROUT ; handle error
:1 STA TMP ; save location
LDX #0
:2 LDA IMSG,X ; installed message
BEQ MODCD
JSR COUT
INX
BNE :2
MODCD LDA #<START
STA PTR ; set program pointer
LDA #>START
STA PTR+1
MODLP LDY #0
LDA (PTR),Y ; get opcode
JSR CHKOPLEN ; check length
LDY OPLEN ; put length in Y-reg
CPY #2 ; 2=3 byte instruction
BNE NOMOD ; no modification nec
LDA (PTR),Y ; get HOB
CMP #>START ; below program?
BCC NOMOD ; yes
CMP #>MODEND+$100 ; above program?
BCS NOMOD ; yes
FIX SEC
SBC #>START ; subtract min. location
CLC
ADC TMP ; add new address
STA (PTR),Y ; save new byte
NOMOD INY
TYA
CLC
ADC PTR ; advance
STA PTR ; pointer
BCC DONE
INC PTR+1
DONE LDA PTR+1
CMP #>MODEND ; check HOB
BCC MODLP
LDA PTR
CMP #<MODEND ; end of program?
BCC MODLP ; no
*
LDA EXTRNCMD+1 ; position current
STA NXTCMD+1 ; external command
LDA EXTRNCMD+2
STA NXTCMD+2
LDA #0
STA FNAM ; zero filename
STA A4L ; set mem destination
STA EXTRNCMD+1 ; and command
LDA TMP ; location
STA EXTRNCMD+2
STA A4L+1
*
LDA #<START ; set mem start
STA A1L
LDA #>START
STA A1L+1
LDA #<END ; and mem end
STA A2L ; addresses
LDA #>END
STA A2L+1
LDY #0
JSR MOVE ; move memory
CLC
RTS ; return to BASIC
*
IMSG HEX 8D
ASC "AutoSave Installed!",8D8D00
LST OFF
DS \
LST ON
*
START CLD
LDA INBUF ; check input buffer
CMP #"S" ; for our command
BNE :1
CMP #"s" ; check lowercase
BNE :1
LDA INBUF+1
CMP #$8D
BEQ OURS
:1 SEC ; flag not our command
NXTCMD JMP $0000 ; link to next command
OURS LDA #0
STA XLEN ; command length-1
STA XCNUM ; external command
STA PBITS ; no parsing
STA PBITS+1
LDA #<XRETURN ; set to
STA XTRNADDR ; known RTS
LDA #>XRETURN
STA XTRNADDR+1
JSR CROUT
GTPFX LDA #$C7 ; GET_PREFIX command
JSR GOSYSTEM ; get the Prefix
BCS ER1 ; handle error
LDA TBUF ; system Prefix set?
BNE CKFNM ; yes
GTVLNM LDA #$60 ; slot 6, drive 1
STA SUNITNUM ; set unit number
LDA #<PFXBUF ; set location of
STA SBUFADR ; Prefix storage
LDA #>PFXBUF ; buffer
STA SBUFADR+1
LDA #$C5 ; ON_LINE command
JSR GOSYSTEM ; get Volume name
BCS ER1
STPFX LDA PFXBUF ; get first byte
AND #%00001111 ; isolate length info
TAY ; save in Y-reg
LDA #'/' ; start with slash
LDX #0
:1 INX
STA TBUF,X ; store name character
LDA PFXBUF,X ; get next name char
DEY ; reduce counter
BPL :1 ; loop for another char
STX TBUF ; length byte
LDA #$C6 ; SET_PREFIX command
JSR GOSYSTEM ; set Prefix in PRODOS
BCS ER1
CKFNM JSR CROUT
JSR UP
LDA FNAM ; current filename set?
BNE SV4 ; yes
LDX #0
SV1 LDA MSG1,X ; print enter
BEQ SV2 ; filename
JSR COUT ; message
INX
BNE SV1
SV2 JSR GETLN1 ; get input
LDX #$FF
:1 INX
LDA INBUF,X ; get char from buffer
CMP #$8D ; end of input?
BEQ SV3 ; yes
ORA #$80 ; convert to positive ASCII
STA FNAM+1,X ; store in filename location
CPX #64 ; max length of 64
BNE :1
LDA #16 ; SYNTAX error
ER1 JMP ERROUT
SV3 STX FNAM ; filename length
JMP OPEN ; open file
SV4 LDX #0 ; print
:1 LDA MSG2,X ; save as
BEQ :2 ; message
JSR COUT
INX
BCC :1
:2 LDA CV
STA TMP
LDX #0
:3 INX
LDA FNAM,X ; print
ORA #$80 ; filename
JSR COUT
CPX FNAM
BCC :3
LDA #'?' ; print inverse
JSR COUT ; question mark
:4 LDA KBD ; wait for
BPL :4 ; keypress
PHA
BIT RD80COL ; 80 col?
BMI :6 ; yes
LDA CH
BNE :5
LDA TMP
JSR TABV
LDA #39
STA CH
BNE :7
:5 DEC CH
JMP :7
:6 DEC OURCH
:7 JSR CLREOL ; clear question mark
PLA
CMP #"Y" ; uppercase Y?
BEQ :9 ; yes
CMP #"y" ; lowercase y?
BEQ :9 ; yes
CMP #$8D ; CR?
BEQ :9 ; yes
CMP #$9B ; Escape key?
BNE :8 ; no
BIT STROBE ; strobe keyboard
JMP RTN ; and return to BASIC
:8 LDA TMP
JSR TABV
LDA #9 ; set
STA CH ; cursor to
STA OURCH ; beginning of filename
JMP SV2 ; and get new input
:9 BIT STROBE
OPEN JSR LDFNAM ; put filename in TBUF
LDA HIMEM+1 ; address of all-purpose buffer
STA OSYSBUF+1 ; set open I/O buffer
LDA #0
STA OSYSBUF
LDA #$C8 ; OPEN command
JSR GOSYSTEM ; open the file
BCC STEOF ; file opened
CMP #6 ; path not found
BEQ CREATE ; so create file
CMP #7
BNE ER2 ; other errors
CREATE LDA #$E3 ; file access code
STA CRACESS
LDA #$FC ; Applesoft program file
STA CRFILID
LDA #1 ; standard file
STA CRFKIND
STA CRAUXID ; LOB of load address
LDA #8
STA CRAUXID+1 ; HOB of load address
JSR LDFNAM
LDA #$C0 ; CREATE command
JSR GOSYSTEM ; create file
BCC OPEN ; go back and open file
ER2 JMP ERROUT
STEOF LDA OREFNUM ; copy open ref number
STA SREFNUM ; to set eof
STA RWREFNUM ; read/write
STA CFREFNUM ; and close parm lists
LDA #0
STA SEOF ; set EOF to 0
STA SEOF+1
STA SEOF+2
LDA #$D0 ; SET_EOF command
JSR GOSYSTEM ; set EOF
BCS ER2
WRITE LDA PGMST ; set data address
STA RWDATA ; pointer to start
LDA PGMST+1 ; of Applesoft program
STA RWDATA+1
SEC
LDA PGMEND ; set write byte count
SBC PGMST ; to length of
STA RWCOUNT ; program
SEC
LDA PGMEND+1
SBC PGMST+1
STA RWCOUNT+1
LDA #$CB ; WRITE command
JSR GOSYSTEM ; xfer data to disk
BCS ER2
CLOSE LDA #$CC ; CLOSE command
JSR GOSYSTEM ; close file
BCS ER2
GFLIN JSR LDFNAM
LDA #$0A ; parm count for GFI call
STA SSGINFO
LDA #$C4 ; GET_FILE_INFO command
JSR GOSYSTEM ; fill GFI parm list
BCS ER2
SFLIN JSR LDFNAM
LDA #$07 ; parm count for SFI call
STA SSGINFO
LDA DATM ; set new
STA FIMDATE ; modification date
LDA DATM+1
STA FIMDATE+1
LDA #$C3 ; SET_FILE_INFO command
JSR GOSYSTEM ; set new date
BCS ER2
JSR CROUT
RTN CLC
RTS
*
LDFNAM LDX #0
LDA FNAM ; get length byte
STA TBUF ; store in TBUF
:1 INX
LDA FNAM,X ; xfer filename
STA TBUF,X ; to TBUF
CPX FNAM
BCC :1
RTS
MODEND = *
*
MSG1 ASC "ENTER FILENAME: ",00
MSG2 ASC "SAVE AS: ",00
END = *
LST OFF